package com.luxsoft.siipap.cxp.service;

import java.text.MessageFormat;
import java.util.List;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.luxsoft.siipap.cxp.dao.ContraReciboDao;
import com.luxsoft.siipap.cxp.model.ContraRecibo;
import com.luxsoft.siipap.cxp.model.ContraReciboDet;
import com.luxsoft.siipap.dao.GenericDao;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.model.core.Proveedor;
import com.luxsoft.siipap.service.impl.GenericManagerImpl;

public class ContraReciboManagerImpl extends GenericManagerImpl<ContraRecibo, Long> implements ContraReciboManager{

	public ContraReciboManagerImpl(GenericDao<ContraRecibo, Long> genericDao) {
		super(genericDao);
	}
	
	private ContraReciboDao getDao(){
		return (ContraReciboDao)this.genericDao;
	}

	public List<ContraReciboDet> buscarPartidas(final ContraRecibo recibo) {
		return getDao().buscarPartidas(recibo);
	}

	public List<ContraRecibo> buscarRecibos(Periodo p) {
		return getDao().buscarRecibos(p);
	}

	public ContraRecibo buscarInicializado(Long id) {
		return getDao().buscarInicializado(id);
	}

	@Override
	@Transactional(propagation=Propagation.REQUIRED)
	public void remove(Long id) {
		ContraRecibo recibo=get(id);
		for(ContraReciboDet det:recibo.getPartidas()){
			if(det.getCargoAbono()!=null){
				String pattern="El documento {0} de tipo {1} esta ya esta contabilizado " +
						"por lo que el contrarecibo no puede ser eliminado";
				throw new IllegalStateException(MessageFormat.format(pattern, det.getCargoAbono().getDocumento(),det.getTipo()));
			}
		}
		super.remove(id);
	}
	
	
	/**
	 * Buscar recibos pendientes de analisis
	 * 
	 * @param p
	 * @param tipo
	 * @return
	 */
	public List<ContraReciboDet> buscarRecibosPendientes(final Proveedor p,ContraReciboDet.Tipo tipo){
		return getDao().buscarRecibosPendientes(p, tipo);
	}

	/**
	 * Busca recibos pendientes de analisis
	 * 
	 * @param tipo
	 * @return
	 */
	public List<ContraReciboDet> buscarRecibosPendientes(ContraReciboDet.Tipo tipo){
		return getDao().buscarRecibosPendientes(tipo);
	}

}
